﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace JinglunIdrRead
{
    class JinglunApi
    {
        [DllImport("Sdtapi")]
        public static extern int InitComm(int iPort);
        [DllImport("Sdtapi")]
        public static extern int CloseComm();
        [DllImport("Sdtapi")]
        public static extern int Routon_ShutDownAntenna();

        /**
         * 发现身份证卡并选择卡,必须寻卡才能读身份证
         * 
         * @return
         */
        [DllImport("Sdtapi")]
        public static extern int Authenticate();

        /**
         * 读证
         * 
         * @param pMsg
         *            最少192字节;姓名 31 汉字 ;性别 3 汉字; 民族 10 汉字 ;出生日期 9 CCYYMMDD ;住址 71 汉字和数字; 公民身份号码 19 数字; 签发机关 31 汉字; 有效期起始日期 9 CCYYMMDD; 有效期截止日期 9 CCYYMMDD 有效期为长期的表示为汉字“长期”
         * 
         * @param len
         * @return
         */
        [DllImport("Sdtapi")]
        public static extern int ReadBaseMsg(byte[] pMsg, int[] len);

        /**
         * 用于寻卡
         * 
         * @return 1 M1-S50卡; 2 CPU卡; 3 M1-S70卡; 4 Mifare UltraLight卡; 0 未找到卡; 其他 不明卡错误码
         * 
         */
        [DllImport("Sdtapi")]
        public static extern int Routon_IC_FindCard();

        /**
         * 用于读取IC卡的序列号，自动完成找卡、选卡等过程
         * 
         * @param SN
         *            [out] 字符指针，需要在调用时分配内存，字节数不小于16。
         * @return
         */
        [DllImport("Sdtapi")]
        public static extern int Routon_IC_HL_ReadCardSN(byte[] SN);

        /**
         * 读身份证内码
         * @param pcSAMID
         * @return
         */
        [DllImport("Sdtapi")]
        public static extern int ReadIINSNDN(byte[] pMsg);
        //关蜂鸣器
        [DllImport("Sdtapi")]
        public static extern int Routon_Mute(bool isMute);

        [DllImport("Sdtapi")]
        public static extern int HID_BeepLED(bool BeepON, bool LEDON, int duration);

        public static byte[] readIDCard()
        {
            int init=InitComm(1001);
            HID_BeepLED(true, true, 100);
            if (init!=1)
            {
                return new byte[0];
            }
            int search=Authenticate();
            if (search != 1)
            {
                return new byte[0];
            }
            byte[] pMsg = new byte[192];
            int readBaseMsg = ReadBaseMsg(pMsg, null);
            if (readBaseMsg != 1)
            {
                return new byte[0];
            }
            CloseComm();
            return pMsg;
        }

        /**
         * 读身份证的卡片内码
         **/
        public static byte[] readICCard()
        {
            int init = InitComm(1001);
            if (init != 1)
            {
                return new byte[0];
            }
            byte[] pMsg = new byte[16];
            int readBaseMsg = ReadIINSNDN(pMsg);
            if (readBaseMsg != 1)
            {
                return new byte[0];
            }

            return pMsg;
        }

        /**
         * 读ic卡的卡片内码
         **/
        public static byte[] readICCardSn()
        {
            int init = InitComm(1001);
            if (init != 1)
            {
                return new byte[0];
            }
            byte[] pMsg = new byte[16];
            int readBaseMsg = Routon_IC_HL_ReadCardSN(pMsg);
            if (readBaseMsg != 1)
            {
                return new byte[0];
            }

            return pMsg;
        }


        public static string ByteToString(byte[] bytes)
        {

            StringBuilder strBuilder = new StringBuilder();

            foreach (byte bt in bytes)
            {

                strBuilder.AppendFormat("{0:X2}", bt);

            }

            return strBuilder.ToString();

        }

        internal static byte[] readIDCardSn()
        {
            int init = InitComm(1001);
            if (init != 1)
            {
                return new byte[0];
            }
            HID_BeepLED(true, true, 100);
            byte[] pMsg = new byte[16];
            int readBaseMsg = ReadIINSNDN(pMsg);
            if (readBaseMsg != 1)
            {
                return new byte[0];
            }
            CloseComm();
            return pMsg;
        }
    }
}
